import router from './router'
import store from './store'
import {
  Message
} from 'element-ui'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import {
  getToken,
  removeToken
} from './utils/auth'
import {
  asyncRouterMapComm,
  constantRouterMap,
  asyncRouterMap
} from '@/router' //,asyncRouterMapAdmin

NProgress.configure({
  showSpinner: false
})

// function hasPermission(roles, permissionRoles) {
//   if (roles && roles.indexOf('admin') >= 0) return true

//   if (!permissionRoles) return true
//   return roles.some(role => permissionRoles.indexOf(role) >= 0)
// }

const whiteList = ['/login', '/authredirect']

router.beforeEach(async (to, from, next) => {
  // 确定用户是否已登录
  const hasToken = getToken()
  // 判断是否有token
  if (hasToken) {
    const hasRoles = store.getters.roles && store.getters.roles.length > 0
    if (hasRoles && store.getters.permission_routers) {
      next()
    } else {
      // 角色必须是对象数组
      const {
        roles
      } = await store.dispatch('getUserInfo');
      if(roles.length==0){
        Message({
          message: '您没有相应的菜单权限，请与管理员确认!',
          type: 'warning',
          showClose: true,
        })
        removeToken();
        return
      }
      getDict();
      // 根据角色生成可访问路由映射
      const accessRoutes = await store.dispatch('generateRoutes', roles)
      console.log('生成的静态路由',accessRoutes)
      router.addRoutes(accessRoutes)
      // hack 方法，以确保addRoutes是完整的
      // 设置replace: true，这样导航就不会留下历史记录
      //next({ ...to, replace: true })
      if (to.path != '/') {
        //ymc 20210224 解决页面刷新参数丢失问题
        next({ ...to })
      } else {
        //自动跳转到权限默认的第一个菜单
        next(accessRoutes[0].redirect)
      }
    }
  } else {
    // 在免登录白名单，直接进入
    if (whiteList.indexOf(to.path) !== -1) {
      next()
    } else {
      // 没有访问权限的其他页面被重定向到登录页面
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})

router.afterEach(() => {
  NProgress.done()
})

function getDict () {
  if (store.getters.dictionary.length == 0) {
    let dictArry = sessionStorage.getItem('dictionary');
    if (dictArry) {
      store.dispatch("writeDictonary", JSON.parse(dictArry))
    } else {
      store.dispatch('getDictAll'); //获取所有字典
    }
  }
}



/**
 * 过滤菜单
 */
// ymc 二次注释
// function filterMenu(rou,roles){
//   //匹配分配的权限
//   asyncRouterMapComm.forEach( item =>{
//     //copy
//     var { ...temp } = item;
//     temp.children = [];
//     roles.forEach(rous =>{
//       if(item.path == rous.router){
//         if(item.children && rous.childrens && rous.childrens.length > 0){
//           item.children.forEach(child=>{
//             rous.childrens.forEach(rouChild =>{
//               if(rouChild.router.split("/")[rouChild.router.split("/").length - 1] == child.path.split("/")[child.path.split("/").length - 1]) {
//                 temp.children.push(child);
//               }
//             })
//           })
//         }else{
//           temp.children = [];
//         }
//         //过滤已经存在的
//         if( temp.children.length > 0 && !rou.some( so =>{
//             if(temp.path == so.path){
//               return true;
//             }
//             return false;
//           })){
//           rou.push(temp);
//         }
//       }
//     })
//   });
//   return rou;
// }
